import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;

/**
 * 从指定目录加载 .class 文件的简单自定义类加载器。
 */
public class 自定义类加载器 extends ClassLoader {
    private final File baseDir;

    /**
     * @param baseDirPath 要加载类的根目录（例如 "plugins"）
     */
    public 自定义类加载器(String baseDirPath) {
        // 指定父类加载器为系统类加载器（默认）
        super(ClassLoader.getSystemClassLoader());
        this.baseDir = new File(baseDirPath);
    }

    public 自定义类加载器(String baseDirPath, ClassLoader parent) {
        super(parent);
        this.baseDir = new File(baseDirPath);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        // 将类名转成文件路径，例如 plugin.Hello -> plugin/Hello.class
        String relPath = name.replace('.', File.separatorChar) + ".class";
        File classFile = new File(baseDir, relPath);

        if (!classFile.exists()) {
            throw new ClassNotFoundException("Class file not found: " + classFile.getAbsolutePath());
        }

        try {
            byte[] classBytes = Files.readAllBytes(classFile.toPath());
            // defineClass 会把字节数组转换为 Class 对象
            Class<?> cls = defineClass(name, classBytes, 0, classBytes.length);
            // 可选：resolve（通常由 loadClass 在需要时自动调用）
            // resolveClass(cls);
            return cls;
        } catch (IOException e) {
            throw new ClassNotFoundException("Failed to load class bytes for " + name, e);
        }
    }

    // （可选）覆盖 getResourceAsStream / getResource 来从 baseDir 提供资源
}